/**
 *      验证器
 *      require 是否为空必须在第一位
 */
function regexVerify() {
    /**
     * 验证规则
     * @type {{}}
     */
    this.ruleList = {};
    /**
     * 错误信息
     * @type {{}}
     */
    // this.msg = {};
    /**
     * 场景列表
     * @type {{}}
     */
    this.sceneList = {};
    /**
     * 当前场景
     * @type {Array}
     */
    this.sceneSingle = [];
    /**
     * 是否有场景
     * @type {boolean}
     */
    this.IsScene = false;
    /**
     * 验证方法
     * @param data
     * @param errorFunction
     * @returns {*}
     */
    this.check = function (fromdata, errorFunction) {
        var result = this.getCheckList();
        var data = this.getArrayData(fromdata);
        if (!this.IsScene) result = this.haSubscript(result, data);
        for (var x in result) {
            var content = data[result[x]['alias']];
            var method = result[x]['reg'];
            //  防止函数名冲突
            var prefix = "regexVerify_";
            //   值是否为空
            this.istrue = x + "|false";
            if (method.indexOf("require") < 0)
                this.istrue = x + "|" + ( eval(prefix + 'require("' + content + '", " ")') ? 'true' : 'false');
            for (var xx in method) {
                var fun = method[xx];
                var wei = fun.indexOf(":");
                var respons;
                var func = fun;
                var arg2 = 1;
                if (wei > 0) {
                    var argument = fun.split(":");
                    func = argument[0];
                    arg2 = argument[1]
                }
                if (func == 'confirm')
                    respons = eval(prefix + func + '("' + content + '",' + data[arg2] + ',"' + result[arg2]['name'] + '")');
                else if (func == 'compare'){
                    var param = arg2.split("-");
                    var method = (!param[2] || param[1] == undefined) ? 2: param[2];
                    respons = eval(prefix + func + '("' + content + '","'+ param[0] + '","'+ data[param[1]] + '","' + result[param[1]]['name'] + '","'+ method +'")');
                }
                else
                    respons = eval(prefix + func + '("' + content + '",' + arg2 + ')');
                if (respons && this.istrue == x + "|false"){
                    var errorMsg = result[x]['name'] + respons;
                    // return this.getError(result[x]['name'] + respons, x + "." + func);
                    if (typeof errorFunction == 'function') errorFunction(errorMsg);
                    else alert(errorMsg);
                    return errorMsg;
                }
            }
        }
        return false;
    };
    /**
     * 获取所有规则
     * @param allrole
     * @param data
     */
    this.haSubscript = function (allrole, data) {
        var list = [];
        for (var role in allrole)
            if (data[role] != undefined) list[role] = allrole[role];
        return list;
    };
    /**
     * 设置当前场景
     * @param data
     */
    this.scene = function (data) {
        this.sceneSingle = this.sceneList[data] ? this.sceneList[data] : false;
        if (this.sceneSingle != false) this.IsScene = true;
        return this;
    };
    /**
     * 获取验证规则列表
     * @returns {Array}
     */
    this.getCheckList = function () {
        var list = [];
        var type = false;
        if (this.sceneSingle || this.sceneSingle.length > 0)
        //  场景所包含的规则
            for (var sc in this.sceneSingle) {
                type = 1;
                var alias = this.sceneSingle[sc].split("|");
                //  是否存在别名
                if ((alias.length - 1) == 0) list[this.sceneSingle[sc]] = [];
                else {
                    var nowalias = (alias[1] && alias[1].length > 0) ? alias[1] : alias[0];
                    list[nowalias] = [alias[0], alias[2]];
                }
            }
        zlist = this.getRoleInfo(list, type);
        return zlist;
    };
    /**
     *  获取当前场景规则详情
     * @param list
     * @param type
     * @returns {Array|*}
     */
    this.getRoleInfo = function (list, type) {
        for (var rule in this.ruleList) {
            var nailas = false;
            var nvalue = false;
            var key = rule.split("|");
            var value = this.ruleList[rule].split("|");
            if (list[key[0]] && type) {
                nailas = list[key[0]][0];
                nvalue = list[key[0]][1];
                list[key[0]] = [];
                list[key[0]]['alias'] = nailas ? nailas : key[0];
                list[key[0]]['name'] = nvalue ? nvalue : key[1];
                list[key[0]]['reg'] = value;
            }
            if (!type) {
                list[key[0]] = [];
                list[key[0]]['alias'] = nailas ? nailas : key[0];
                list[key[0]]['name'] = nvalue ? nvalue : key[1];
                list[key[0]]['reg'] = value;
            }
        }
        return list;
    };
    /**
     * 经序列化的二维数组变为一维数组
     * @param data
     * @returns {Array}
     */
    this.getArrayData = function (data) {
        var array = [];
        if (typeof data == 'string') {
            var result = data.split('&');
            for (var str in result) {
                var string = result[str].split('=');
                array[string[0]] = decodeURI(string[1]);
            }
        } else {
            for (var i in data) {
                if (typeof data[i] == 'object') array[data[i]['name']] = decodeURI(data[i]['value']);
                else {
                    array = data;
                    break;
                }
            }
        }
        return array;
    };
    /**
     * 获取错误信息
     * @param msg
     * @param flg
     * @returns {*}
     */
    // this.getError = function (msg, flg) {
    //     if (this.msg[flg.toString()])
    //         return this.msg[flg.toString()];
    //     return msg;
    // };
}

/**
 * 必须存在
 * @param data
 * @returns {*}
 */
function regexVerify_require(data, un) {
    if (!data || data == null || data == false)
        return "必须存在";
    return false;
};

/**
 * 长度验证
 * @param data
 * @param leng
 * @returns {*}
 */
function regexVerify_length(data, leng) {
    if (data.length != leng)
        return "长度必须为" + leng;
    return false;
};

/**
 * 纯数字
 * @param data
 * @returns {*}
 */
function regexVerify_number(data, un) {
    var reg = /^\d+$/;
    if (!reg.test(data))
        return "只能为纯数字";
    return false;
}

/**
 * 浮点数
 * @param data
 * @returns {*}
 */
function regexVerify_float(data, un) {
    var reg = /^([1-9]\d*\.?\d*)|(0\.\d*[1-9])$/;
    if (!reg.test(data))
        return "只能为纯数字和小数点";
    return false;
}

/**
 * 布尔值
 * @param data
 * @returns {*}
 */
function regexVerify_boolean(data, un) {
    if (typeof data != 'boolean')
        return "只能为 true 或 false";
    return false;
}

/**
 * 邮箱
 * @param data
 * @returns {*}
 */
function regexVerify_email(data, un) {
    var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
    if (!reg.test(data))
        return "只能是邮箱地址";
    return false;
}

/**
 * 数组
 * @param data
 * @returns {*}
 */
function regexVerify_array(data, un) {
    if (data instanceof Array)
        return "只能是数组";
    return false;
}

/**
 * yes no 1    协议验证
 * @param data
 * @returns {*}
 */
function regexVerify_accepted(data, un) {
    if (data != 'yes' && data != 'no' && data != 1 && data != "true")
        return "请勾选";
    return false;
}

/**
 * 日期
 * @param data
 * @returns {*}
 */
function regexVerify_date(data, un) {
    if (new Date(date).getDate() == date.substring(date.length - 2))
        return "只能是日期格式";
    return false;
}

/**
 * 字母
 * @returns {*}
 */
function regexVerify_alpha(data, un) {
    var reg = /^[A-Za-z]+$/;
    if (!reg.test(data))
        return "只能为字母";
    return false;
}

/**
 * 数字，字母，下划线验证
 * @param data
 * @returns {*}
 */
function regexVerify_alphaDash(data, un) {
    var reg = /^\w+$/;
    if (!reg.test(data))
        return "只能为数字，字母，下划线";
    return false;
};

/**
 * 数字，字母
 * @param data
 * @returns {*}
 */
function regexVerify_alphaNumber(data, un) {
    var reg = /^[a-zA-z0-9]+$/;
    if (!reg.test(data))
        return "只能为数字，字母";
    return false;
};

/**
 * 汉字
 * @param data
 * @returns {*}
 */
function regexVerify_chs(data, un) {
    var reg = /^[\u4e00-\u9fa5]{0,}$/;
    if (!reg.test(data))
        return "只能为汉字";
    return false;
}

/**
 * 汉字与字母
 * @param data
 * @returns {*}
 */
function regexVerify_chsAlpha(data, un) {
    var reg = /^[\u4E00-\u9FA5A-Za-z]+$/;
    if (!reg.test(data))
        return "只能为汉字和字母";
    return false;
}

/**
 * 汉字、字母与数字
 * @param data
 * @returns {*}
 */
function regexVerify_chsAlphaNum(data, un) {
    var reg = /^([A-Za-z]*\d*[\u4E00-\u9FA5]+[A-Za-z]*\d*)$/;
    if (!reg.test(data))
        return "只能为汉字、字母和数字";
    return false;
}

/**
 * 汉字、字母、数字、下划线_及破折号-
 * @param data
 * @returns {*}
 */
function regexVerify_chsDash(data, un) {
    var reg = /^(\w*-*[\u4E00-\u9FA5]+\w*-*)$/;
    if (!reg.test(data))
        return "只能为汉字、字母、数字、下划线_及破折号-";
    return false;
};

/**
 * 域名或ip
 * @param data
 * @returns {*}
 */
function regexVerify_activeUrl(data, un) {
    var reg = /^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(info)|(cc)|(com\.cn)|(net\.cn)|(org\.cn)|(name)|(biz)|(tv)|(cn)|(mobi)|(name)|(sh)|(ac)|(io)|(tw)|(com\.tw)|(hk)|(com\.hk)|(ws)|(travel)|(us)|(tm)|(la)|(me\.uk)|(org\.uk)|(ltd\.uk)|(plc\.uk)|(in)|(eu)|(it)|(jp)|(co)|(me)|(mx)|(ca)|(ag)|(com\.co)|(net\.co)|(nom\.co)|(com\.ag)|(net\.ag)|(fr)|(org\.ag)|(am)|(asia)|(at)|(be)|(bz)|(com\.bz)|(net\.bz)|(net\.br)|(com\.br)|(de)|(es)|(com\.es)|(nom\.es)|(org\.es)|(fm)|(gs)|(co\.in)|(firm\.in)|(gen\.in)|(ind\.in)|(net\.in)|(org\.in)|(jobs)|(ms)|(com\.mx)|(nl)|(nu)|(co\.nz)|(net\.nz)|(org\.nz)|(tc)|(tk)|(org\.tw)|(idv\.tw)|(co\.uk)|(vg)|(ad)|(ae)|(af)|(ai)|(al)|(an)|(ao)|(aq)|(ar)|(as)|(au)|(aw)|(az)|(ba)|(bb)|(bd)|(bf)|(bg)|(bh)|(bi)|(bj)|(bm)|(bn)|(bo)|(br)|(bs)|(bt)|(bv)|(bw)|(by)|(cd)|(cf)|(cg)|(ch)|(ci)|(ck)|(cl)|(cm)|(cr)|(cu)|(cv)|(cx)|(cy)|(cz)|(dj)|(dk)|(dm)|(do)|(dz)|(ec)|(ee)|(eg)|(er)|(et)|(fi)|(fj)|(fk)|(fo)|(ga)|(gd)|(ge)|(gf)|(gg)|(gh)|(gi)|(gl)|(gm)|(gn)|(gp)|(gq)|(gr)|(gt)|(gu)|(gw)|(gy)|(hm)|(hn)|(hr)|(ht)|(hu)|(id)|(ie)|(il)|(im)|(iq)|(ir)|(is)|(je)|(jm)|(jo)|(ke)|(kg)|(kh)|(ki)|(km)|(kn)|(kr)|(kw)|(ky)|(kz)|(lb)|(lc)|(li)|(lk)|(lr)|(ls)|(lt)|(lu)|(lv)|(ly)|(ma)|(mc)|(md)|(mg)|(mh)|(mk)|(ml)|(mm)|(mn)|(mo)|(mp)|(mq)|(mr)|(mt)|(mu)|(mv)|(mw)|(my)|(mz)|(na)|(nc)|(ne)|(nf)|(ng)|(ni)|(no)|(np)|(nr)|(nz)|(om)|(pa)|(pe)|(pf)|(pg)|(ph)|(pk)|(pl)|(pm)|(pn)|(pr)|(ps)|(pt)|(pw)|(py)|(qa)|(re)|(ro)|(ru)|(rw)|(sa)|(sb)|(sc)|(sd)|(se)|(sg)|(si)|(sk)|(sl)|(sm)|(sn)|(sr)|(st)|(sv)|(sy)|(sz)|(td)|(tf)|(tg)|(th)|(tj)|(tl)|(tn)|(to)|(tr)|(tt)|(tz)|(ua)|(ug)|(uk)|(uy)|(uz)|(va)|(vc)|(ve)|(vi)|(vn)|(vu)|(wf)|(ye)|(yt)|(yu)|(za)|(zm)|(zw))$/i;
    var ip = data.split(".");
    if (!reg.test(data) && (ip.length != 4))
        return "只能为正确的域名或ip地址";
    return false;
}

/**
 * 有效的URL地址
 * @param data
 * @returns {*}
 */
function regexVerify_url(data, un) {
    var reg = /^((https|http|ftp|rtsp|mms)?:\/\/)+[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
    if (!reg.test(data))
        return "只能为有效的URL地址";
    return false;
}

/**
 * ip地址
 * @param data
 * @returns {*}
 */
function regexVerify_ip(data, un) {
    var ip = data.split(".");
    if (ip.length != 4)
        return "只能为正确ip地址";
    return false;
}

/**
 * 位数最大值
 * @param data
 * @param max
 * @returns {*}
 */
function regexVerify_max(data, max) {
    var y = parseInt(data.length);
    var b = parseInt(max);
    if (y > b)
        return "最大：" + max + "位";
    return false;
}

/**。。
 * 位数最小值
 * @param data
 * @param max
 * @returns {*}
 */
function regexVerify_min(data, min) {
    var y = parseInt(data.length);
    var b = parseInt(min);
    if (y < b)
        return "最小：" + min + "位";
    return false;
}
/**
 * 比较大小
 * @param data      数值
 * @param type      比较方式  > < .....
 * @param min       比较值
 * @param name      对应字段名字
 * @param method    方式  1 数值比较  2 字段比较(默认)
 */
function regexVerify_compare(data, type, min, name, method) {
    switch (type){
        case "gt":
        case ">":
            if (parseFloat(data) <= parseFloat(min))
                return "必须大于" + ((method == 1) ? min : name) + "的值";
            break;
        case "egt":
        case ">=":
            if (parseFloat(data) < parseFloat(min))
                return "必须大于等于" + ((method == 1) ? min : name) + "的值";
            break;
        case "lt":
        case "<":
            if (parseFloat(data) > parseFloat(min))
                return "必须小于" + ((method == 1) ? min : name) + "的值";
            break;
        case "elt":
        case "<=":
            if (parseFloat(data) > parseFloat(min))
                return "必须小于等于" + ((method == 1) ? min : name) + "的值";
            break;
        case "eq":
        case "=":
            if (parseFloat(data) != parseFloat(min))
                return "必须等于" + ((method == 1) ? min : name) + "的值";
            break;
    }
}
/**
 * 验证某个字段是否和另外一个字段的值一致
 * @param data
 * @param min
 * @param name
 * @returns {*}
 */
function regexVerify_confirm(data, min, name) {
    if (data.toString() !== min.toString())
        return "与" + name + "不一致";
    return false;
}

/**
 * 正则验证
 * @param data
 * @param regex
 * @param msg
 * @returns {*}
 */
function regexVerify_regex(data, regex) {
    if (!regex.test(data))
        return 12;
    return false;
}